// #include <bits/stdc++.h>
// using namespace std;

// int main() {
//     int a[5] = {1, 2, 3, 4, 5};
//     int b[5];
//     for(int i = 0; i < 5; i++) {
//         cin >> b[i];
//     }
//     for(int i = 0; i < 4; i++) {
//         swap(b[i], b[i + 1]);
//         int f = 0;
//         for(int j = 0; j < 5; j++) {
//             if(a[j] != b[j]) {
//                 f = 1;
//                 break;
//             }
//         }
//         if(!f) {
//             cout << "Yes\n";
//             return 0;
//         }
//         swap(b[i], b[i + 1]);
//     }
//     cout << "No\n";
//     return 0;
// }

// #include <bits/stdc++.h>
// using namespace std;
// #define int long long

// signed main() {
//     int n, m;
//     cin >> n >> m;
//     vector<string> a(n);
//     for(int i = 0; i < n; i++) cin >> a[i];
//     int x1 = INT_MAX, x2 = INT_MIN, y1 = INT_MAX, y2 = INT_MIN;
//     for(int i = 0; i < n; i++) {
//         for(int j = 0; j < m; j++) {
//             if(a[i][j] == '#') {
//                 x1 = min(x1, i), x2 = max(x2, i);
//                 y1 = min(y1, j), y2 = max(y2, j);
//             }
//         }
//     }
//     for(int i = x1; i <= x2; i++) {
//         for(int j = y1; j <= y2; j++) if(a[i][j] == '.') {
//             cout << "No\n";
//             return 0;
//         }
//     }
//     cout << "Yes\n";
// }

// #include <bits/stdc++.h>
// using namespace std;
// #define int long long

// signed main() {
//     int n;
//     cin >> n;
//     vector<int> a(n);
//     for(int i = 0; i < n; i++) cin >> a[i];
//     unordered_map<int, int> mp;
//     auto dfs = [&](auto&& dfs, int u, auto& cur, int used)->void {
//         if(u == n) {
//             int p = 0;
//             for(auto x : cur) p ^= x;
//             mp[p] = 1;
//             return;
//         }
//         for(int i = 0; i < used; i++) {
//             int lst = cur[i];
//             cur[i] += a[u];
//             dfs(dfs, u + 1, cur, used);
//             cur[i] = lst;
//         }
//         if(used < n) {
//             cur[used] = a[u];
//             dfs(dfs, u + 1, cur, used + 1);
//             cur[used] = 0;
//         }
//     };
//     vector<int> cur(n);
//     dfs(dfs, 0, cur, 0);
//     cout << mp.size() << endl;
//     return 0;
// }

#include <bits/stdc++.h>
using namespace std;
#define int long long 
int n, m;

int cal(int x, auto vec) {
    vector<int> dp(m + 1);
    for(auto [b, c] : vec) {
        for(int i = m; i >= c; i--){
            dp[i] = max(dp[i], dp[i - c] + b);
        }
    }
    for(int i = 0; i <= m; i++) {
        if(dp[i] >= x) return i;
    }
    return -1;
}

signed main() {
    cin >> n >> m;
    vector<array<int, 2>> vec[3];
    for(int i = 0; i < n; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        vec[a - 1].push_back({b, c});
    }
    auto check = [&](int x)->bool {
        int res = 0;
        for(int i = 0; i < 3; i++) {
            int val = cal(x, vec[i]);
            if(val == -1) return false;
            res += val;
        }
        return res <= m;
    };
    int l = 0, r = 1e9;
    while(l < r) {
        int mid = l + r + 1 >> 1;
        if(check(mid)) l = mid;
        else r = mid - 1;
    }
    cout << l << endl;
    return 0;
}